
import os
import cv2
from matplotlib import pyplot as plt, cm
import numpy as np
from utils.deal_image import noise_remove_cv2, cut_vertical

"""图片的预处理及切割"""

# 显示灰度图像
def show_gray_img(img):
    plt.imshow(img, cmap=cm.gray)
    plt.show()

if __name__ == '__main__':
    # 获取当前脚本的路径作为根路径
    source_root = os.path.dirname(os.path.abspath(__file__))
    
    # 定义原始图像文件夹路径和切割后图像文件夹路径
    image_path = os.path.join(source_root, "image_raw")
    new_image_path = os.path.join(source_root, "image_after_split")
    
    # 获取原始图像文件夹中的所有文件列表
    files = os.listdir(image_path)
   
    # 遍历每个文件
    for key, file in enumerate(files):
        # 构建文件的完整路径
        path = os.path.join(image_path, file)
        
        # 使用 OpenCV 读取图像文件
        img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), 1)

        # 如果图像读取失败，输出错误信息并继续下一个文件
        if img is None:
            print(path, "Failed to read image.")
            continue

        # 转换为灰度图像
        im_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        
        # 对灰度图像进行二值化处理
        ret, im_inv = cv2.threshold(im_gray, 140, 255, 0)
        # 去除孤立点和噪点
        img_clear = noise_remove_cv2(im_inv, 1)
        
        # 显示预处理后的图像
        # show_gray_img(img_clear)
        
        # 使用垂直分割投影法对图像进行切割
        img_list = cut_vertical(img_clear)
        
        t = 1
        # 遍历切割后的字符图像列表
        for i in img_list:
            # 重新定义图像大小
            resize_img = cv2.resize(i, (15, 30))
            
            # 将切割后的图像保存到新的文件夹
            output_file = os.path.join(new_image_path, f"{file.split('.')[0]}_{t}.jpg")
            cv2.imwrite(output_file, resize_img)
            
            t += 1



